package com.swjd.xor;

/**
 * 异或运算交换
 * 不推荐使用
 *
 * @Author liutao
 * @DateTime 2025/1/1 20:37
 */
public class XorSwap {
    public static void main(String[] args) {
        //交换a和b的值 使用异或运算 0和任何数都异或都为0
        // 相同值的异或运算为0;不同值的异或运算为1;
        // 实际是进行内存地址异或，如果内存地址一样则不能异或，否则会为0
        int a = 66;
        int b = 88;
        a = a ^ b; //a= 1^2;b=2
        b = a ^ b; //a=1^2;b=1^2 ^2;b=1^0;b=1
        a = a ^ b;//b=1;a=1^2 ^1;a=2^0;a=2
        System.out.println("a=" + a + " b=" + b);
    }

    /**
     * 找出重复次数为奇数的数
     */
    public static class Test {
        public static void main(String[] args) {
            //做异或运算拿到出现次数为奇数的数
            int[] n = {1, 2, 3, 3, 2, 1, 7, 4, 4};
            int eor = 0;
            //相当于0 ^ 1 ^ 2 ^ 3 ^ 3 ^ 2 ^ 1 ^ 7 ^ 4 ^ 4;
            //异或顺序不会改变结构，所以将偶数先异或，得出0，最后0^7=7;
            for (int i : n) {
                eor ^= i;
            }
            System.out.println(eor);
        }
    }
}
